package com.woniu.task;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.woniu.controller.RelContestRangeController;
import com.woniu.controller.RelUserContestController;
import com.woniu.entity.CtfContest;
import com.woniu.mapper.CtfContestMapper;
import jakarta.annotation.Resource;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * @Author pml
 * @Date 2025/6/11 17:07
 * @Description 考试状态定时更新任务（仅更新状态，不清理关联表）
 **/
@Component // 声明为Spring组件，由容器管理生命周期
public class ContestStatusScheduler {

    @Resource
    private CtfContestMapper ctfContestMapper; // 注入考试表Mapper，用于数据库操作

    // 定时任务执行频率：每分钟0秒执行（平衡实时性和数据库压力）,改成了每小时0分0秒执行一次
    // cron表达式解析：[秒] [分] [时] [日] [月] [周] [年]，此处"0 0 * * * ?"表示每小时整点执行
    @Scheduled(cron = "0 0 * * *  ?")
    public void executeContestStatusUpdate() {
        Date now = new Date(); // 获取当前系统时间（用于时间对比）

        // 1. 处理未开始->进行中的考试
        handlePendingToOngoing(now);

        // 2. 处理进行中->已结束的考试（仅更新状态，不清理关联表）
        handleOngoingToFinished(now);
    }

    /**
     * 处理未开始->进行中的考试
     * @param now 当前时间
     */
    private void handlePendingToOngoing(Date now) {
        // 查询条件：状态=未开始 且 开始时间<=当前时间（使用le表示小于等于，确保准时开始）
        LambdaQueryWrapper<CtfContest> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper
                .eq(CtfContest::getContestStatus, "未开始")
                .le(CtfContest::getStartTime, now);

        // 批量更新状态为进行中（使用LambdaUpdateWrapper确保字段安全）
        LambdaUpdateWrapper<CtfContest> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper
                .eq(CtfContest::getContestStatus, "未开始")
                .le(CtfContest::getStartTime, now)
                .set(CtfContest::getContestStatus, "进行中");

        int updatedCount = ctfContestMapper.update(null, updateWrapper);
        if (updatedCount > 0) {
            System.out.printf("成功更新%d个考试状态为[进行中]", updatedCount); // 输出日志便于监控
        }
    }

    /**
     * 处理进行中->已结束的考试（仅更新状态，不清理关联表）
     * @param now 当前时间
     */
    private void handleOngoingToFinished(Date now) {
        // 查询条件：状态=进行中 且 结束时间<当前时间（使用lt避免刚结束的瞬间未更新）
        LambdaQueryWrapper<CtfContest> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper
                .eq(CtfContest::getContestStatus, "进行中")
                .lt(CtfContest::getEndTime, now);

        // 批量更新状态为已结束（无需查询具体考试ID，直接更新）
        LambdaUpdateWrapper<CtfContest> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper
                .eq(CtfContest::getContestStatus, "进行中")
                .lt(CtfContest::getEndTime, now)
                .set(CtfContest::getContestStatus, "已结束");

        int updatedCount = ctfContestMapper.update(null, updateWrapper);
        if (updatedCount > 0) {
            System.out.printf("成功更新%d个考试状态为[已结束]",updatedCount); // 输出日志便于监控
        }
    }
}